<?php

/**
 * Contrôleur de login
 *
 * @package Controller
 * @author  nroche <nicolas.roche42@gmail.com>
 *
 * TODO:
 *     action passForgotten
 *     mail i18n
 *     codes d'erreurs
 *
 */
class LoginController extends Zend_Controller_Action
{

    /**
     * Affichage du formulaire (vide)
     *     -> vide la 1ere fois
     *     -> à moitié rempli si le `signin` n'a pas marché
     * TODO : gérer si on met le form `signin` ou `subscribe`
     *
     * @return null
     */
    public function indexAction()
    {
//         $params = $this->_request->getParams();
    }

    /**
     * action de log (recue en POST)
     *
     * @return null
     */
    public function signinAction()
    {
        try {
            $request = $this->getRequest();

            if ($request->isPost()) {
                $config = Zend_Registry::get('Zend_Config');
                $vars = $request->getPost();

                if (!isset($vars['email']) || !isset($vars['password']))
                    return;

                // verification en base de données
                $userMapper = Adapter::getUserMapper();
                $userArr = $userMapper->findUser($vars['email'], $vars['password'], $config["security_key"]);

                if ($userArr) { // pas de VO dans la session pour la compatibilité avec d'autres apps
                    $_SESSION['user'] = $userArr;
                    $this->_redirect('index/index');
                }

                $this->_redirect('login/index?login_error=1');
            }
        }
        catch (Exception $e) {
            //             $this->_redirect('login/index');
            // var_dump($this->_getParam('error_handler'));die;
            var_dump($e);die;
        }
    }

    /**
     * action de delog
     *
     * @return null
     */
    public function signoutAction()
    {
        $_SESSION['user'] = null;

        // login controller
        $this->_redirect('login/index');
        //        $this->_forward('index');
    }

    // TODO : mettre dans un utils/tools
    private function generateRandomString($lenght)
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randstring = '';
        for ($i = 0; $i < $lenght; $i++)
        {
            $randstring .= $characters[rand(0, strlen($characters) - 1)];
        }
        return $randstring;
    }

    /**
     * Action d'enregistrement en POST
     *
     * @return null
     */
    public function subscribeAction()
    {
        $request = $this->getRequest();

        if ($request->isPost()) {
            $vars = $request->getPost();

            if (!isset($vars['email']) || !isset($vars['password']) || !isset($vars['publicName']))
                $this->_redirect('login/index?error=100'); // TODO voir erreurs

            // on verifie si il existe deja `email` ou `publicName`
            $userMapper = Adapter::getUserMapper();
            $subscriptionMapper = new App_Model_Map_Subscription();
            $paramName = array(
                    'dbName' => 'publicName',
                    'value' => $vars['publicName'],
            );
            $paramEmail = array(
                    'dbName' => 'email',
                    'value' => $vars['email'],
            );

            // verification publicName
            $users = $userMapper->findUsersByParams(array($paramName));
            if ($users && count($users) > 0)
                $this->_redirect('login/index?error=101'); // TODO voir erreurs

            // verification email
            $users = $userMapper->findUsersByParams(array($paramEmail));
            if ($users && count($users) > 0)
                $this->_redirect('login/index?error=102'); // TODO voir erreurs

            // Ajout de l'utilisateur
            $userMapper->addUser($vars['publicName'], $vars['email'], $vars['password']);

            // recuperation de idUser
            $users = $userMapper->findUsersByParams(array($paramName));
            if (!$users || count($users) != 1)
                $this->_redirect('login/index?error=103'); // TODO voir erreurs

            $idUser = $users[0]['idUser'];

            // generation du token et ajout subscription
            $token = $this->generateRandomString(50);
            $subscriptionMapper->addSubscription($idUser, $token);

            // FIXME : url
            $urlValidate = "http://localhost/mediaglobe/login/validatesubscription/token/" . $token;

            $mailToEmail = "nicolas.roche42@gmail.com"; // FIXME
            $mailToName = "nroche"; // FIXME

            // mail
            // FIXME utils mail qui gère l'i18n
            $body = "Bonjour,<br>
            <br>
            Votre inscription sur Media Globe a été prise en compte.<br>
            <br>
            <b>Pour valider votre compte</b>, veuillez cliquer sur le lien ci-dessous:<br>
            <br>
            <a href='$urlValidate'>cliquez ici</a><br>
            <br>
            Vous pourrez ensuite vous logger en entrant votre adresse e-mail et votre mot de passe.<br>
            <br>
            Cordialement,<br>
            <br>
            L'équipe de Media Globe";
            $mail = new Zend_Mail('UTF-8');
            $mail->setFrom('no-reply@mediaglobe.com', 'Media Globe');
            $mail->addTo($mailToEmail, $mailToName);
            $mail->setSubject('Media Globe - Validez votre inscription');
            $mail->setBodyHtml($body);
            $mail->send();

            // redirection sur le formulaire de login avec un message
            $this->_redirect("login/index?result=sub&value=" . $vars['email']);
        }
    }

    /**
     * action 'mot de passe oublié', en spécifiant l'email
     *
     * On envoie un email avec un lien. Si le lien est cliqué,
     * on envoie un autre mail avec un nouveau pass.
     *
     * @return null
     */
    public function passforgottenAction()
    {
        // TODO
    }

    /**
     * Action de validation d'enrigistrement (appel de cette action avec le token en GET)
     *
     * @return null
     */
    public function validatesubscriptionAction()
    {
        $request = $this->getRequest();
        if ($request->isGet()) {
            $params = $request->getParams();

            if (isset($params['token'])) {

                $subscriptionMapper = new App_Model_Map_Subscription();
                $idUser = $subscriptionMapper->getSubscriptionByToken($params['token']);

                if ($idUser) {
                    echo "token trouvé: userID: " . $idUser;

                    $data = array(
                            'profile' => 2,
                    );
                    $userMapper = Adapter::getUserMapper();
                    $userMapper->updateUser($idUser, $data);

                    $this->_redirect('login/index?m=sub');
                }
                else
                    $this->_redirect('login/index?error=200'); // TODO voir erreurs
            }
            else
                $this->_redirect('login/index?error=201'); // TODO voir erreurs
        }
        else
            $this->_redirect('login/index?error=202'); // TODO voir erreurs
    }

}

